package org.web.accesscontrollist.sdk.biz;

import org.web.accesscontrollist.sdk.dto.AclResourceDetailBatchDTO;
import org.web.accesscontrollist.sdk.dto.AclResourceDetailDTO;
import org.web.accesscontrollist.sdk.dto.AclResourceUserBindingDTO;
import org.web.accesscontrollist.sdk.dto.query.QueryAclResourceDetailRequest;
import org.web.accesscontrollist.sdk.dto.query.QueryAclResourceUserBindingRequest;
import org.web.accesscontrollist.sdk.dto.redundancy.DetailRedundancyDTO;
import org.web.base.domain.ResultDO;

import java.util.List;


public interface AclResourceDetailBiz {

    /**
     * 校验数据信息：
     *   @see org.web.accesscontrollist.sdk.helper.AclHelper . checkSaveAclDetailBatchDTO(aclResourceDetailBatchDTO , UpdateGroup.class)
     * 1、@see aclResourceDetailBatchDTO , aclResourceDetailBatchDTO.class定义的数据格式。
     * 2、@see AclResourceDetailDTO , 遍历 List<AclResourceDetailDTO> aclResourceDetailDTOList ， 校验每个AclResourceDetailDTO对象。
     * 3、aclResourceDetailDTOList 中的typeName和detailName组合，不能够重复。businessLine、typeName和detailName组合，逻辑唯一。
     * 4、AclResourceDetailDTO 如果aclResourceDetailDTO.getMaxLevel() 大于零，则校验Level的合法性。
     * 第二部分，支持幂等处理，查询数据库。根据businessLine、typeName和detailName， 校验唯一性。
     * 5、构建InsertList和UpdateList, 如果数据记录不存在，还要执行ValidationHelper.validate(AclResourceDetailDTO.class, aclResourceDetailDTO, InsertGroup.class)，判断新增记录的合法性。
     * 6、数据依赖关系，ResourceDetail依赖 ResourceType,根据businessLine、typeName校验ResourceType是否存在，则不进行更新。所以创建Detail信息前，需要保证关联的ResourceType信息存在。
     * 使用限制说明
     * （1）结果自动返回主键ID，但是业务接入方，禁止直接使用主键，而是通过逻辑唯一数据，进行交互处理。
     *  从业务角度分析，该接口是低频操作，且有businessLine隔离。不对下面规格做主张处理。
     * （2）存在并发问题，不对并发产生的问题做处理。
     * （3）不对性能和处理时效做处理，
     */
    ResultDO<List<AclResourceDetailDTO>> saveAclResourceDetailBatch(AclResourceDetailBatchDTO aclResourceDetailBatchDTO);

    /***
     *  (1)首先处理删除逻辑，指定isDelete="Y",删除的处理逻辑，如果binding表，存在detail_name，则不允许删除，需要删除在binding表中，指定的detail_name信息。
     *  (2)如果是删除逻辑，则不再走其他属性的变更。
     *  (3) 如果做更新操作，level_resource>0 , 则判断level的合法性。
     *  (4) 如果删除的记录，在【detail】中不存在，则抛出异常，通知oldDetailName信息查不到。
     *  (5)type_name 的变更与删除，只能操作type_name. 会同步更新 detail和binding。
     *  (6)detail变量的字段信息有：detail_name、resource_level、first_level、second_level、third_level、fourth_level、fifth_level
     *
     * @return 变更的记录总数。
     */
    ResultDO<Integer> executeDetailRedundancyDTO(DetailRedundancyDTO detailRedundancyDTO);


    ResultDO<List<AclResourceDetailDTO>> selectAclResourceDetailList(QueryAclResourceDetailRequest queryAclResourceDetailRequest);

}
